
處理檔案時常會看到標題上的三種檔案類型,這篇來瞭解下這三者。
Blob (Binary Large Object),是一種二進位檔案的資料,音檔、圖片等都能被儲存為 Blob 格式。在 JavaScript 中透過 Blob 才能讀取二進位類型的檔案,當然這種檔案類型並不是前端才有的。
Blob 對象表示一個不可變、原始數據的類文件對象。
如同一般檔案,Blob 也有自己的 MIME 型別及文件大小(Size)。
語法為:
const blob = new Blob(array, options);
這兩個參數分別代表:
array:存放 Array、ArrayBuffer、ArrayBufferView、Blob、DOMString 等類型的陣列。options:定義資料的 MIME 格式(未知則為空字串)。實際建立的例子:
const obj = { hello: "world" };
const blob = new Blob([JSON.stringify(obj, null, 2)], {
type: "application/json",
});
而 blob 與 ArrayBuffer 的差別在於:
我們可以透過建立出來的 Blob 使用其方法,如 slice、arrayBuffer 等。
參考以下範例,建立出 reader 後讀取 Blob。
const reader = new FileReader();
reader.addEventListener('load', function () {
console.log(reader.result);
});
reader.readAsArrayBuffer(blob);
File 則是繼承了 Blob,並且新增了 name、lastModified、lastModifiedDate、webkitRelativePath 屬性。詳細的介紹可以參考 MDN。
File 與 Blob 不同的是,File 是實際檔案產生出的檔案物,不是新增物件後關連到 File。
我們在前端使用 <input type="file">,取得的也是 File (Filelist)。同樣的 File 也能使用 FileReader 讀取,前端中常見的上傳圖片 + 預覽也能透過 FileReader.readAsDataURL() 完成。
const input = document.querySelector("input");
input.addEventListener("change", (e) => {
console.log(e.target.files) // 取得 FileList
})
另外再介紹 baes64。 base64 是表示二進制資料的一種方法,主要用來解決各系統和傳輸協定中二進制不兼容的問題。
我們可以透過它傳輸、儲存資料,例如以下就是透過 data URI 建立的 base64 資料圖檔 :
data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/4gIoSUNDX1BST0ZJTEUAAQEAAAIYAAAAAAIQAABtbnRyUkdCIFhZWiAAAAAAAAAAAAAAAA.......
在前端使用 data URI 可以減少 HTTP Request 請求,但建議使用較小的圖檔,因為除了會讓內容增加變肥外,data URI 並不會被瀏覽器快取。
文末推薦一篇不錯的文章:
File、Blob、ArrayBuffer、Buffer联系及区别